<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Funktsiooni ja nende tagastus, ehk return väärtused</title>
    </head>
    <body>
        <?php
            /*
             * Oletame, et meil on lihtne summeerimisfunktsioon, mis liidab
             * talle ette antud 2 parameetrit kokku
             */
             function liidaSisendparameetridKokku($liidetav1, $liidetav2)
             {
                 $summa = $liidetav1 + $liidetav2;
             }
             
             /*
              * Kõik mida eelnev funktsioon teeb ongi vaid see, et ta tõesti arvutab
              * selle summa välja. Ta aga ei väljasta oma tulemust mitte kusalgi.
              * Isegi echo ei väljasta antud juhul mitte midagi, sest funktsioon ei 
              * tagasta mitte midagi.
              */
             echo liidaSisendparameetridKokku(2, 3);
             
             /*
              * Et funktsioonist tema poolt genereeritud tulemus kätte saada, tuleb
              * funktsioon midagi tagastama panna. Probleemi lahendab käsklus 
              * return. Kirjutame eeltoodud funktsiooni ümber nii, et see echo 
              * abil brauserisse väljundi genereeriks:
              */
             function liidaSisendparameetridKokkuJaTagastaVaartus($liidetav1, $liidetav2)
             {
                 $summa = $liidetav1 + $liidetav2;
                 return $summa;
             }
             
             echo '<br/>' . liidaSisendparameetridKokkuJaTagastaVaartus(2, 3);
             echo '<br/>';
             
             /*
              * Oletame, et tahame, et funktsioon tagastaks mitu väärtus.
              * Näiteks, tahaksime, et üks funktsioon teeb meile korraga ära 
              * nii liitmise, lahutamise, korrutamise ning jagamise tehte.
              * (NB! funktsioonide puhul pole muidugi ilus nii palju asju ühte 
              * patta toppida. Tegelikkuses tuleks teha piisavalt väiksed ja võimalikult
              * eraldiseisvate ülesannetega väikesed funktsioonid. See näide jäägu 
              * aga kõige lõppu) 
              * 
              * Et enda suurt funktsiooni realiseerida, võtame appi final väärtused
              * ehk lõplikud väärtused ja massiivi.
              */
             
             //Defineerime lõplikud väärtused arvutuste positsioonidele massiivis
             define('VALJASTA_SUMMA', 0);
             define('VALJASTA_VAHE', 1);
             define('VALJASTA_KORRUTIS', 2);
             define('VALJASTA_JAGATIS', 3);
             function liidaLahutaKorrutaJagaTagasta($tegur1, $tegur2)
             {
                 $summa = $tegur1 + $tegur2;
                 $vahe = $tegur1 - $tegur2;
                 $korrutis = $tegur1 * $tegur2;
                 $jagatis = $tegur1 / $tegur2;
                 $teheteMassiiv = array($summa, $vahe, $korrutis, $jagatis);
                 return $teheteMassiiv;
             }
             
             $funktsiooniTulemusMassiivina = liidaLahutaKorrutaJagaTagasta(10, 2);
             //Tänu lõplikele väärtustele ei pea me meenutama, mida positsioon 0, või 1
             //või 2 jne endas säilitas. Küsime tulemust inimkeelele sarnaselt.
             echo 'summa: ' . $funktsiooniTulemusMassiivina[VALJASTA_SUMMA];
             echo '<br/>';
             echo 'vahe: ' . $funktsiooniTulemusMassiivina[VALJASTA_VAHE];
             echo '<br/>';
             echo 'korrutis: ' . $funktsiooniTulemusMassiivina[VALJASTA_KORRUTIS];
             echo '<br/>';
             echo 'jagatis: ' . $funktsiooniTulemusMassiivina[VALJASTA_JAGATIS];
             echo '<br/>';
             //Samalaadse tulemuse oleks andnud ka massiivi väärtuste sildistamine!
             
             
             /*
              * Eelneva funktsiooni ilusam realisatsioon. Defineerime osade kaupa 
              * eraldi liitmise, lahutamise, korrutamise ja jagamise eest vastutava 
              * funktsiooni.
              */
             function liida($liidetav1, $liidetav2)
             {
                 $summa = $liidetav1 + $liidetav2;
                 return $summa;
             }
             
             function lahuta($lahutatav, $lahutaja)
             {
                 $vahe = $lahutatav - $lahutaja;
                 return $vahe;
             }
             
             function korruta($tegur1, $tegur2)
             {
                 $korrutis = $tegur1 * $tegur2;
                 return $korrutis;
             }
             
             function jaga($jagatatav, $jagaja)
             {
                 $jagatis = $jagatatav / $jagaja;
                 return $jagatis;
             }
             
             //Koondame väiksed funktsioonid suurde kokku
             function korrutaJagaLiidaLahuta($tegur1, $tegur2)
             {
                 return array('tagasta_summa' => liida($tegur1, $tegur2), 
                     'tagasta_vahe' => lahuta($tegur1, $tegur2),
                     'tagasta_korrutis' => korruta($tegur1, $tegur2),
                     'tagasta_jagatis' => jaga($tegur1, $tegur2));
             }
             
             //Väljastame tulemuse. Funktsiooni poolt tagastatud massiivist 
             //küsime tulemust siltide abil. 
             $yhisfunktsiooniTulemusMassiivina = korrutaJagaLiidaLahuta(10, 2);
             echo '<br/>summa: ' . $yhisfunktsiooniTulemusMassiivina['tagasta_summa'];
             echo '<br/>';
             echo 'vahe: ' . $yhisfunktsiooniTulemusMassiivina['tagasta_vahe'];
             echo '<br/>';
             echo 'korrutis: ' . $yhisfunktsiooniTulemusMassiivina['tagasta_korrutis'];
             echo '<br/>';
             echo 'jagatis: ' . $yhisfunktsiooniTulemusMassiivina['tagasta_jagatis'];
             echo '<br/>';
             
             /*
              * Muidugi massiivi asemel oleksime edukalt veel kõigele lisaks ka 
              * if, elseif, else konstruktsioone kasutades funktsiooni poolt 
              * tagastatavaid väärtusi kontrollida saanud.
              */
        ?>
    </body>
</html>
